package myQueue;

//单链表实现队列
public class MyQueue {
    //单链表实现的队列，入队元素在链表尾插
    //出队元素是弹出链表头节点

    //定义节点
    public class Node{
        public int val;
        public Node next;
        //节点的构造方法
        public Node(int val) {
            this.val = val;
        }
    }

    //标记链表的头节点和为节点
    public Node head;
    public  Node last;
    //队列元素个数计数器
    public int useSize;


    //元素入队方法
    public void push(int data){
       //构造新节点
        Node newNode=new Node(data);
        //判断是否是第一次元素入队
        if(empty()){
            head=newNode;
            last=head;
            useSize++;
        }else{
            last.next=newNode;
            last=newNode;
            useSize++;
        }
    }

    //元素出队方法
    public int poll(){
        //如果队列中没元素则抛出异常
        if(empty()){
            throw new MyqueueEmptyException("队列为空，无法出元素");
        }
        //弹出队首元素(链表头节点)
        int temp=head.val;
        head=head.next;
        //如果队列中只有一个元素，还要讲last的引用对象赋为null
        if(useSize==1){
            last=null;
        }
        useSize--;
        return temp;
    }

    //获取队顶元素
    public int peek(){
        //判断是否为空
        if(empty()){
            throw new MyqueueEmptyException("队顶无元素");
        }
        return head.val;
    }

    //判断队列是否为空
    public boolean empty(){
        return useSize==0;
    }

    //返回队列的元素个数
    public int size(){
        return useSize;
    }

    //打印所有队列的元素
    public void display(){
        Node cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }
}
